const int MAXN = 1005;
 
int G[MAXN][MAXN];//存图 
int cnt[MAXN];//存每个点度的奇偶性 
int N,M;//点个数，边条数 
stack<int> S;//存路径 
 
void dfs(int u){
    for(int v=1; v<=N; v++)
        if(G[u][v]){
            G[u][v]-=1;
            G[v][u]-=1;
            dfs(v);
            //不用恢复边！
        }
    S.push(u);//出栈时记录
}
 
inline void Print(){//输出路径 
	if(!S.empty()){
	    printf("%d",S.top());
	    S.pop();
	} 
	while(!S.empty()){
	    printf(" %d",S.top());
	    S.pop();
	}
	printf("\n");
}
 
inline void init(){
	memset(cnt,0,sizeof cnt);
	memset(G,0,sizeof G);
}
 
int main(){
    while(scanf("%d %d",&N,&M) == 2){
    	init();
    	int u,v;
	    for(int i=1 ; i<=M ; ++i){
	        scanf("%d %d",&u,&v);
	        G[u][v] += 1;
	        G[v][u] += 1;
	        cnt[u] ^= 1;//利用了异或运算，0表示度为偶数，1表示度为奇数。
	        cnt[v] ^= 1;
	    }
	    for(u=1; u<=N ; ++u){//注意判断图是否从1点开始 
	        if(cnt[u]) break;
	    }
	    if(u == N+1) dfs(1);//都为偶节点，从随便一个开始都行 
	    else dfs(u);//从奇节点开始 
	    Print();
	}
   
    return 0;
}